﻿// testclass.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <vector>
using namespace std;
// 两个npc npc有血量和名字
// 处理npc被攻击
string npc1_name = "npc1";
int npc1_health = 100;
string npc2_name = "npc2";
int npc2_health = 100;

void AtackNpc1(int atk)
{
    npc1_health -= atk;
    cout << npc1_name << "was attacked!" << "-" << atk << endl;
}

void AtackNpc2(int atk)
{
    npc2_health -= atk;
    cout << npc2_name << "was attacked!" << "-" << atk << endl;
}

vector<string>npcs_name;
vector<int>npcs_health;
void AtackNpc(int index, int atk)
{
    npcs_health[index] -= atk;
    cout << "vector:" << npcs_name[index] << "was attacked!" << "-" << atk << endl;
}

class Npc
{
public:
    string name_;
    int health_ = 100;
    void Atack(int atk)
    {
        health_ -= atk;
        cout << name_ << "was attacked!" << "-" << atk << endl;
    }
};

//类型名称 驼峰法
class MyClass
{
public:
    //成员变量
    int x{ 0 };//c++11开始，声明赋初值
    int y{ 0 };
    char name[16]{ "myclass name" };
    void TestIn(int v) // 内联函数
    {
        //普通成员函数可以访问私有的静态成员变量
        count++;
        cout << "this addr = " << (long long)this << endl;
        

        x += v;
        y += v;
        cout << "inline:" << x << ":" << y << endl;
        cout << name << endl;

        this->Test(20);
        Test(20);
        (*this).Test(20);
    }

    static void TestStatic()
    {
        //没有this指针 不能访问非静态成员变量
        count++;
        //x++;
        cout << "Test Static" << endl;
    }

    void Test(int v);

    //静态成员变量声明
    static int size;

    //静态成员函数应用场景1
    //单件模式 类的对象只存在一份
    static MyClass& Instance()
    {
        static MyClass mc;
        return mc;
    }
    
    //静态成员函数应用场景2 成员函数封装成普通函数
    //静态成员函数可以访问私有成员
    static void RunStatic(MyClass& obj)
    {
        obj.Run();
    }

private:
    void Run() { cout << "MyClass Run" << endl; }
    //private 私有只有（静态）成员函数可以访问
    static int count;
};

//静态成员变量定义
int MyClass::size{ 0 };
int MyClass::count{ 0 };

void MyClass::Test(int v)
{
    x += v;
    y += v;
    cout << x << ":" << y << endl;
    cout << name << endl;
}

int main()
{
    {
        MyClass::Instance().Test(100);

        MyClass::size++;
        cout << "MyClass::size = " << MyClass::size << endl;
        MyClass mc;
        cout << "mc.size = " << mc.size << endl;
        
        MyClass::RunStatic(mc);
        MyClass::TestStatic();
    }
    //MyClass mcf;
    //mcf.Test(10);
    //mcf.TestIn(30);
    //cout << "mcf addr = " << (long long)&mcf << endl;

    //MyClass mc1;
    ////打印内存空间的大小
    //cout << sizeof(mc1) << "|" << sizeof(MyClass) << endl;
    //// 访问成员变量
    //cout << "mc1.name = " << mc1.name << endl;
    //cout << "mc1.x = " << mc1.x << endl;

    //MyClass* mc2 = new MyClass;
    //mc2->x = 100;
    //cout << "mc2->x = " << mc2->x << endl;
    //cout << "(*mc2).x = " << (*mc2).x << endl;
    //delete mc2;

    //MyClass* mc3 = &mc1;

    ////自定义类型复制
    //MyClass mc4;
    //mc1.x = 99;
    //mc4 = mc1; //复制mc1的所有成员变量到mc4
    //cout << "mc4.x = " << mc4.x << endl;

    /*AtackNpc1(10);
    AtackNpc2(20);

    npcs_name.push_back("vector npc1");
    npcs_health.push_back(100);

    npcs_name.push_back("vector npc2");
    npcs_health.push_back(100);

    AtackNpc(0, 30);
    AtackNpc(1, 40);

    Npc npc1;
    npc1.name_ = "class npc1";

    Npc npc2;
    npc2.name_ = "class npc2";
    npc1.Atack(50);
    npc2.Atack(60);*/

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
